#ifndef HEX_PARSER_H
#define HEX_PARSER_H

#include <string>
#include <vector>
#include <map>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <cstdint>

// HEX记录类型枚举
enum class HexRecordType {
    DATA = 0x00,                    // 数据记录
    END_OF_FILE = 0x01,            // 文件结束记录
    EXTENDED_SEGMENT_ADDRESS = 0x02, // 扩展段地址记录
    START_SEGMENT_ADDRESS = 0x03,   // 开始段地址记录
    EXTENDED_LINEAR_ADDRESS = 0x04, // 扩展线性地址记录
    START_LINEAR_ADDRESS = 0x05     // 开始线性地址记录
};

// HEX记录结构
struct HexRecord {
    uint8_t length;           // 数据长度
    uint16_t address;         // 地址
    HexRecordType type;       // 记录类型
    std::vector<uint8_t> data; // 数据
    uint8_t checksum;         // 校验和
    bool valid;               // 记录是否有效
};

// 段信息结构
struct SegmentInfo {
    uint32_t start_address;
    uint32_t end_address;
    size_t data_size;
    std::vector<uint8_t> data;
};

// HEX文件信息结构
struct HexFileInfo {
    std::string filename;
    size_t total_records;
    size_t data_records;
    size_t total_data_bytes;
    uint32_t start_address;
    uint32_t end_address;
    uint32_t extended_linear_address;
    uint16_t extended_segment_address;
    std::map<uint32_t, uint8_t> memory_map; // 地址到数据的映射
    std::vector<HexRecord> records;
    std::vector<SegmentInfo> segments; // 段信息
};

class HexParser {
private:
    HexFileInfo file_info;
    
    // 解析单行HEX记录
    HexRecord parseRecord(const std::string& line);
    
    // 计算校验和
    uint8_t calculateChecksum(const HexRecord& record);
    
    // 验证校验和
    bool validateChecksum(const HexRecord& record);
    
    // 将十六进制字符串转换为字节
    std::vector<uint8_t> hexStringToBytes(const std::string& hex);
    
    // 将十六进制字符串转换为数字
    uint32_t hexStringToNumber(const std::string& hex);

public:
    HexParser();
    ~HexParser();
    
    // 解析HEX文件
    bool parseFile(const std::string& filename);
    
    // 解析单行HEX记录
    bool parseSingleRecord(const std::string& record);
    
    // 获取文件信息
    const HexFileInfo& getFileInfo() const;
    
    // 打印文件信息
    void printFileInfo() const;
    
    // 打印内存映射
    void printMemoryMap() const;
    
    // 验证文件格式
    bool validateFile() const;
    
    // 获取指定地址的数据
    std::vector<uint8_t> getDataAtAddress(uint32_t address, size_t length) const;
    
    // 获取所有数据记录
    const std::vector<HexRecord>& getDataRecords() const;
    
    // 分析段信息
    void analyzeSegments();
    
    // 打印段信息
    void printSegmentInfo() const;
};

#endif // HEX_PARSER_H
